//============================================================================
// Name        : tpodd.cpp
// Author      : Emmanuel
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, ANSI-style
//============================================================================

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <string.h>
#include <stddef.h>
#include <iostream>
#include <time.h>
#include "ArbolB+/ArbolBMas.h"
#include "EstructurasArbol/Registro.h"
#include "EstructurasArbol/Clave.h"
#include "IndexarDiccionario/DictionaryManager.h"
#include "IndexarDiccionario/Indexador.h"
#include "IndexarDiccionario/Sort.h"
#include "CSV/FrasesFile.h"
#include "Comunes/Constantes.h"
#include "Comunes/RecordFrase.h"
#include "Hash/Hash.h"


using namespace std;
using namespace dictionary;
using namespace indexador;
using namespace ordenamiento;

int testNuevoDiccionario(){
	ArchivoDeTexto * diccionario = new ArchivoDeTexto("diccionario.txt", R);
	ArchivoDeTexto * nuevodicc = new ArchivoDeTexto("diccionario_nuevo.txt", W);
	string linea = "";
	while(!diccionario->is_EOF()){
		char caracter = '/';
		linea = diccionario->obtenerLinea();
		Palabra::remove_character_to_end(caracter, linea);
		nuevodicc->escribirLinea(linea);
	}

	return 0;
}

int testArbolBMas() {

	ArbolBMas* arbolito = new ArbolBMas("arbolito",2);

	Registro* e1=  new Registro(new Clave("disponible"),10);
	Registro* e2=  new Registro(new Clave("dispositivo"),10);
	Registro* e3=  new Registro(new Clave("dispuesto"),10);
	Registro* e4=  new Registro(new Clave("dispar"),10);
	Registro* e5=  new Registro(new Clave("disporar"),10);
	Registro* e6=  new Registro(new Clave("disperso"),10);
	Registro* e7=  new Registro(new Clave("diplomatico"),10);
	Registro* e8=  new Registro(new Clave("dental"),25);
	Registro* e9=  new Registro(new Clave("dorado"),10);
	Registro* e10= new Registro(new Clave("dia"),23);
	Registro* e11= new Registro(new Clave("disponibilidad"),10);
	Registro* e12= new Registro(new Clave("diferente"),10);
	Registro* e13= new Registro(new Clave("aumento"),39);
	Registro* e14= new Registro(new Clave("lluvia"),10);
	Registro* e15= new Registro(new Clave("luz"),10);
	Registro* e16= new Registro(new Clave("auto"),10);
	Registro* e17= new Registro(new Clave("llovizna"),10);
	Registro* e18= new Registro(new Clave("aurora"),10);
	Registro* e19= new Registro(new Clave("belleza"),10);
	Registro* e20= new Registro(new Clave("fiero"),100);
	Registro* e21= new Registro(new Clave("samanta"),15);
	Registro* e22= new Registro(new Clave("mente"),10);
	Registro* e23= new Registro(new Clave("loco"),10);
	Registro* e24= new Registro(new Clave("locura"),10);
	Registro* e25= new Registro(new Clave("sarmiento"),10);
	Registro* e26= new Registro(new Clave("fiel"),10);
	Registro* e27= new Registro(new Clave("aura"),10);
	Registro* e28= new Registro(new Clave("graduados"),10);
	Registro* e29= new Registro(new Clave("luciernaga"),10);

	arbolito->insertar(e1);
	arbolito->insertar(e2);
	arbolito->insertar(e3);
	arbolito->insertar(e4);
	arbolito->insertar(e5);
	arbolito->insertar(e6);
	arbolito->insertar(e7);
	arbolito->insertar(e8);
	arbolito->insertar(e9);
	arbolito->insertar(e10);
	arbolito->insertar(e11);
	arbolito->insertar(e12);
	arbolito->insertar(e13);
	arbolito->insertar(e14);
	arbolito->insertar(e15);
	arbolito->insertar(e16);
	arbolito->insertar(e17);
	arbolito->insertar(e18);
	arbolito->insertar(e19);
	arbolito->insertar(e20);
	arbolito->insertar(e21);
	arbolito->insertar(e22);
	arbolito->insertar(e23);
	arbolito->insertar(e24);
	arbolito->insertar(e25);
	arbolito->insertar(e26);
	arbolito->insertar(e27);
	arbolito->insertar(e28);
	arbolito->insertar(e29);

	arbolito->MostrarArbol();

	Registro* probando = arbolito->buscar("llora");
	probando->toString();

	Registro* e30= new Registro(new Clave("llora"),55);
	arbolito->insertar(e30);

	Registro* probando2 = arbolito->buscar("llora");
	probando2->toString();

	arbolito->MostrarArbol();
	arbolito->EscribirListadoOrdenado();

	return 0;
}

int testInsertArbolBFromDictionary(){

	ArchivoBinario * file = new ArchivoBinario("fusiones/etapa2/archivo0.bin", R);

	int offset = 0;
	string id_termino = "";
	string termino = "";

	Registro* reg = NULL;

	ArbolBMas* arbolito = new ArbolBMas("arbolito",32);

	while(!file->is_EOF()){

		id_termino = file->obtenerLinea();
		termino = id_termino.substr(9, id_termino.length() - 1);
		reg = new Registro(new Clave(termino),offset);
		arbolito->insertar(reg);
		offset++;
		delete reg;
		cout << "registro " << offset <<endl;



	}

	arbolito->MostrarArbol();
	arbolito->EscribirListadoOrdenado();
	return 0;
}

int testFrasesFile() {
	Hash hash;
	FrasesFile * file = new FrasesFile("Frases_Celebres.txt");
	RecordFrase * record = NULL;
	string cadena;
	int contador = 1;
	while(!file->is_EOF()){
		if (contador == 300) break;
		cout << "inserto : " << contador << endl;
		record = file->leer_registro();
		hash.insertar_registro(*record);
		contador ++;
	}
	cout << "###################HASH##################" << endl;
	hash.show();



	return 0;
}

int main() {
/*
	string filein_name = "diccionario_nuevo.txt";
	string fileout_name = "dictionary_normalizado.txt";

	DictionaryManager dic = DictionaryManager(filein_name);
	dic.obtenerCopiaNormalizada(fileout_name);
	Indexador indexador = Indexador(fileout_name);
	indexador.indexar_archivo();
	Sort s;
	s.sort("indexed_file.bin","particiones");*/

	//testFrasesFile();

	time_t start, end;
	double dif;

	time(&start);

//	testInsertArbolBFromDictionary();
	testFrasesFile();

	time(&end);

	dif = difftime(end, start);

	cout<<"tardo: " << dif << "segundos" <<endl;

//	testNuevoDiccionario();

	return 0;
}
